grammar Alex;

prog:
	(statment+
	functionDecl*)+
	
	;

statment : 
	
	assignStatment
	|ifStatment
	|functionInvokStatment
	|forStatment
	|';'
	;
	
assignStatment :
	ID EQU expression ';'
	|ID EQU ID ';' ;
ifStatment :
	'if' '(' expression ')' statment 
	('else' statment )? ;
	
functionInvokStatment:
	ID '(' ID ')' ';'
	| ID '('  ')' ';' ;	

forStatment:
	'for' '(' assignStatment  expression ';'  expression ')' '{'
		statment+
	'}';


expression : Number 
	| Number ADD Number
	| Number SUB Number
	| Number MUL Number
	| Number DIV Number
	| Number '<' Number
	| Number '>' Number
	| Number '==' Number
	| Number '&&' Number
	| Number '&' Number
	| Number '|' Number
	| Number '++'
	| Number '--'
	| '++' Number
	| '--' Number
	| ID '++'
	| ID '--'
	| '++' ID
	| '--' ID
	| ID '<' Number
	| ID '>' Number
	| ID '==' Number
	| ID '!=' Number
	;
	
functionDecl :
	'function' ID  '('  ')' '{' statment+ '}' ';'  //func without parms 
	|'function' ID  '(' ID  (',' ID)*  ')' '{' statment+ '}' ';' ; //func with params

		
	
ID: [_a-zA-Z]+;

ADD             : '+';
SUB             : '-';
MUL             : '*';
DIV             : '/';
EQU				: '=';
SEM				: ';';

Number: [1-9][0-9]*;

WS : [ \t\r\n]+ -> skip ;

